# 代码注释：
#
# 首先，我们定义一个二维数组 dp，其中 dp[l][i] 表示长度为 l 且和为 i 的组合数。我们将 dp[0][0] 初始化为 1，表示长度为 0 且和为 0 的组合只有一种情况，即一个元素都不取。
# 接下来，我们遍历每个长度 l，从 1 到 max_len。对于每个长度，我们遍历每个可能的和 i，从 0 到 target。然后，我们遍历数组 nums 中的每个元素 num。如果 i - num >= 0，则将 dp[l - 1][i - num] 累加到 dp[l][i]。
# 最后，我们返回 dp[max_len][target]，表示所有长度不超过 max_len 且和为 target 的组合数。
# 需要注意的是，这个解法在处理大规模数据时可能会导致超时。根据题目要求，我们可以假设 nums 的长度不超过 200，target 不超过 1000。同时，我们可以选择一个合适的最大排列长度

def combinationSum4(nums, target, max_len):
    n = len(nums)
    #max_len + 1 行，target + 1列的二维数据，每个值都是0
    dp = [[0] * (target + 1) for _ in range(max_len + 1)]
    dp[0][0] = 1

    #range不包含后者
    for l in range(1, max_len + 1):
        for i in range(target + 1):
            for num in nums:
                if i - num >= 0:
                    dp[l][i] += dp[l - 1][i - num]

    return dp[max_len][target]


    # 生成测试代码
if __name__ == '__main__':
    nums = [1, 2, 3]
    target = 4
    max_len = 4
    print(combinationSum4(nums, target, max_len))
